"""
高级计算器核心逻辑模块
提供所有数学运算功能
"""
import math


class Calculator:
    """高级计算器类，包含所有数学运算功能"""
    
    def __init__(self):
        """初始化计算器"""
        pass
    
    # 基础运算
    def add(self, a: float, b: float) -> float:
        """加法运算"""
        return a + b
    
    def subtract(self, a: float, b: float) -> float:
        """减法运算"""
        return a - b
    
    def multiply(self, a: float, b: float) -> float:
        """乘法运算"""
        return a * b
    
    def divide(self, a: float, b: float) -> float:
        """除法运算"""
        if b == 0:
            raise ValueError("除数不能为零")
        return a / b
    
    def power(self, a: float, b: float) -> float:
        """幂运算"""
        return a ** b
    
    # 科学运算
    def sqrt(self, a: float) -> float:
        """平方根运算"""
        if a < 0:
            raise ValueError("负数无法开平方根")
        return math.sqrt(a)
    
    def square(self, a: float) -> float:
        """平方运算"""
        return a ** 2
    
    def sin(self, a: float) -> float:
        """正弦函数（角度制）"""
        return math.sin(math.radians(a))
    
    def cos(self, a: float) -> float:
        """余弦函数（角度制）"""
        return math.cos(math.radians(a))
    
    def tan(self, a: float) -> float:
        """正切函数（角度制）"""
        return math.tan(math.radians(a))
    
    def log(self, a: float) -> float:
        """自然对数"""
        if a <= 0:
            raise ValueError("对数的真数必须大于零")
        return math.log(a)
    
    def log10(self, a: float) -> float:
        """常用对数"""
        if a <= 0:
            raise ValueError("对数的真数必须大于零")
        return math.log10(a)
    
    def factorial(self, n: float) -> float:
        """阶乘运算"""
        if n < 0:
            raise ValueError("阶乘的数必须为非负整数")
        if n != int(n):
            raise ValueError("阶乘的数必须为整数")
        return math.factorial(int(n))
    
    def percent(self, a: float) -> float:
        """百分比转换"""
        return a / 100
    
    # 数学常数
    @property
    def pi(self) -> float:
        """圆周率π"""
        return math.pi
    
    @property
    def e(self) -> float:
        """自然常数e"""
        return math.e
    
    def evaluate_expression(self, expression: str) -> float:
        """
        安全地计算数学表达式
        支持基本的四则运算和括号
        """
        try:
            # 替换显示符号为Python运算符
            expression = expression.replace("×", "*").replace("÷", "/")
            
            # 简单的安全检查，只允许数字、运算符和括号
            allowed_chars = set("0123456789+-*/.() ")
            if not all(c in allowed_chars for c in expression):
                raise ValueError("表达式包含不允许的字符")
            
            # 使用eval计算表达式
            result = eval(expression)
            return float(result)
            
        except ZeroDivisionError:
            raise ValueError("除数不能为零")
        except SyntaxError:
            raise ValueError("无效的表达式语法")
        except Exception as e:
            raise ValueError(f"计算错误: {str(e)}")


class ScientificCalculator(Calculator):
    """科学计算器类，继承基础计算器并添加更多高级功能"""
    
    def __init__(self):
        super().__init__()
    
    def sinh(self, a: float) -> float:
        """双曲正弦函数"""
        return math.sinh(a)
    
    def cosh(self, a: float) -> float:
        """双曲余弦函数"""
        return math.cosh(a)
    
    def tanh(self, a: float) -> float:
        """双曲正切函数"""
        return math.tanh(a)
    
    def asin(self, a: float) -> float:
        """反正弦函数（返回角度制）"""
        if abs(a) > 1:
            raise ValueError("反正弦函数的参数必须在[-1,1]范围内")
        return math.degrees(math.asin(a))
    
    def acos(self, a: float) -> float:
        """反余弦函数（返回角度制）"""
        if abs(a) > 1:
            raise ValueError("反余弦函数的参数必须在[-1,1]范围内")
        return math.degrees(math.acos(a))
    
    def atan(self, a: float) -> float:
        """反正切函数（返回角度制）"""
        return math.degrees(math.atan(a))
    
    def exp(self, a: float) -> float:
        """指数函数（e^x）"""
        return math.exp(a)
    
    def log2(self, a: float) -> float:
        """以2为底的对数"""
        if a <= 0:
            raise ValueError("对数的真数必须大于零")
        return math.log2(a)
    
    def abs_value(self, a: float) -> float:
        """绝对值"""
        return abs(a)
    
    def ceil(self, a: float) -> float:
        """向上取整"""
        return math.ceil(a)
    
    def floor(self, a: float) -> float:
        """向下取整"""
        return math.floor(a)
    
    def round_number(self, a: float, digits: int = 0) -> float:
        """四舍五入"""
        return round(a, digits)